if (NSEqualRects (rect, NSZeroRect))
return;
+ /* Clear our own bookkeeping of regions that need display */
+ if (impl->needs_display_region)
+ {
+ gdk_region_destroy (impl->needs_display_region);
+ impl->needs_display_region = NULL;
+ }
+
[self getRectsBeingDrawn:&drawn_rects count:&count];
/* Note: arbitrary limit here to not degrade performace too much. It would
gint dx,
gint dy)
{
+ GdkWindowObject *private = (GdkWindowObject *)window;
+ GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *)private->impl;
+
+ int i, n_rects;
+ GdkRegion *intersection;
+ GdkRectangle *rects;
+
+ /* We will intersect the known region that needs display with the given
+ * area. This intersection will be translated by dx, dy. For the end
+ * result, we will also set that it needs display.
+ */
+
+ if (!impl->needs_display_region)
+ return;
+
+ intersection = gdk_region_copy (impl->needs_display_region);
+ gdk_region_intersect (intersection, area);
+ gdk_region_offset (intersection, dx, dy);
+
+ gdk_region_get_rectangles (intersection, &rects, &n_rects);
+
+ for (i = 0; i < n_rects; i++)
+ _gdk_quartz_window_set_needs_display_in_rect (window, &rects[i]);
+
+ g_free (rects);
+ gdk_region_destroy (intersection);
}
gboolean
}
}
+void
+_gdk_quartz_window_set_needs_display_in_rect (GdkWindow *window,
+ GdkRectangle *rect)
+{
+ GdkWindowObject *private;
+ GdkWindowImplQuartz *impl;
+
+ private = GDK_WINDOW_OBJECT (window);
+ impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+
+ if (!impl->needs_display_region)
+ impl->needs_display_region = gdk_region_new ();
+
+ gdk_region_union_with_rect (impl->needs_display_region, rect);
+
+ [impl->view setNeedsDisplayInRect:NSMakeRect (rect->x, rect->y,
+ rect->width, rect->height)];
+
+}
+
void
_gdk_windowing_window_process_updates_recurse (GdkWindow *window,
GdkRegion *region)
{
- GdkWindowObject *private = (GdkWindowObject *)window;
- GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *)private->impl;
int i, n_rects;
GdkRectangle *rects;
gdk_region_get_rectangles (region, &rects, &n_rects);
for (i = 0; i < n_rects; i++)
- {
- [impl->view setNeedsDisplayInRect:NSMakeRect (rects[i].x, rects[i].y,
- rects[i].width, rects[i].height)];
- }
+ _gdk_quartz_window_set_needs_display_in_rect (window, &rects[i]);
g_free (rects);
gdk_region_get_rectangles (expose_region, &rects, &n_rects);
for (n = 0; n < n_rects; ++n)
- {
- [impl->view setNeedsDisplayInRect:NSMakeRect (rects[n].x,
- rects[n].y,
- rects[n].width,
- rects[n].height)];
- }
+ _gdk_quartz_window_set_needs_display_in_rect (window, &rects[n]);
g_free (rects);
}